Phase 10 — Localization and Release Preparation

Markers are the ones the other plans use. An unmarked item is merely planned.

Phase 9 stays open. This arc holds the work that waits on the English wording settling. That is the other languages, the manuals, and what a release needs.

  1. ▶ Every locale says in its own language what the English says. A locale is its configure.ini strings plus its public and help wiki pages. Each is rebuilt from en-US where the old one was machine output. Two scripts were written to find and place the work.
    1. ⚑ Two scripts find what a locale lacks and place translated pages. devlog/devscripts/check_locale.sh counts keys missing or empty, values whose markers differ from English, repeated emoji names, and wiki pages with no counterpart. It maps a folder tag such as el_GR to the page tag el-GR and reports a configure.ini that does not parse. Pages are placed into PublicHelpPages.php by a script kept outside the repository.
    2. ⚑ Arabic. All 4,592 strings, 97 help pages and 15 public pages are written new from the English. They replace an older fill whose pages had broken markup. Code spans in four code-heavy pages were copied back from the English by script. Three pages use an Arabic example where the English has a French one.
    3. ⚑ Bengali. All 4,592 strings are written new from the English. They replace an older fill with garbled values and shared emoji names. Now no two emoji share a name. All 97 help pages and 15 public pages are written new too. Code in five code-heavy pages was copied back from the English by script.
    4. ⚑ German. All 4,586 strings, 15 public pages and 97 help pages are rewritten. Many old values were Spanish or French words, and 63 old help pages had names such as Kriechen,_Um. Eighteen activity names seeded by Createdb.php are rewritten too. An orphan page on the locale writing mode is removed. Its Syntax page lost the ballot-by-mail paragraphs in one patch and is restored from the version before it.
    5. ⚑ Greek. All 4,586 strings, 15 public pages and 97 help pages are written. The old configure.ini did not parse because of unescaped quotes, so Yioop read no Greek string. Greek had no wiki page before. A page name outside ASCII (American Standard Code for Information Interchange) is percent-encoded twice in page_name. Its Markdown Syntax page is now written new, code copied by script.
    6. ⚑ Spanish. All 4,586 strings, 15 public pages and 97 help pages are rewritten. Old values held Portuguese words, and old pages had names such as Rastreo_De_Pedido. Createdb.php seeded the video search as Videos and now seeds Vídeos. Its Markdown Syntax page is now written new, code copied by script.
    7. ⚑ Farsi. All 4,586 strings, 15 public pages and 97 help pages are written; Farsi had no wiki page at all before. Old values held wrong words, such as Falkland Islands for Fiji. Createdb.php seeded the image and news searches with their last letter cut off, and now seeds whole words. Its Markdown Syntax page is now written new, code copied by script.
    8. ⚑ Hindi. All 4,592 strings, 97 help pages and 4 public pages. The 11 older public pages, Syntax among them, are now written new.
    9. ⚑ Indonesian. All 4,592 strings, 97 help pages and 4 public pages. The 11 older public pages, Syntax among them, are now written new.
    10. ⚑ Italian. All 4,592 strings retranslated, 97 help pages and 4 public pages. The 11 older public pages, Syntax among them, are now written new.
    11. ⚑ French. All 4,592 strings, 97 help pages and every public page. check_locale finds nothing missing, empty or mismatched. The 11 older public pages, Syntax among them, are now written new.
    12. ⚑ Hebrew. All 4,592 strings, 97 help pages and every public page. check_locale finds nothing missing, empty or mismatched. The 11 older public pages, Syntax among them, are now written new.
    13. ⚑ Japanese. All 4,592 strings retranslated, 97 help pages and 4 public pages. Code blocks and DNS record lines are copied from the English by script, not retyped. The 11 older public pages, Syntax among them, are now written new. Six help page names that held a space now use underscores.
    14. ⚑ Kannada. All 4,592 strings, 97 help pages and 15 public pages are written new from the English. Code in the code-heavy pages was copied back from the English by script.
    15. ⚑ Korean. All 4,592 strings, 97 help pages and 15 public pages are written new from the English, over three patches. Code in the code-heavy pages was copied back from the English by script, and no emoji name is given twice.
    16. ⚑ Dutch. All 4,592 strings, 97 help pages and 15 public pages are written new from the English, over three patches. Nothing is kept from the earlier translation. Code in the code-heavy pages was copied back from the English by script.
    17. ⚑ Polish. All 4,592 strings, 97 help pages and 15 public pages are written new from the English, over four patches. Every old Polish wiki page was deleted first, unread.
    18. ⚑ Portuguese. All 4,592 strings are written new from the English, and every old Portuguese wiki page is deleted, unread. All 97 help pages and all 15 public pages are written new, the two syntax pages with their code copied from the English by script.
    19. ⚑ Russian. Every old Russian string is blanked and every old Russian wiki page deleted, unread. All 4,592 strings, 97 help pages and 15 public pages are written new from the English. The two syntax pages have their code copied from the English by script.
    20. ⚑ Telugu. Every old Telugu string is blanked and every old Telugu wiki page deleted, unread. All 4,592 strings, 97 help pages and 15 public pages are written new from the English. The two syntax pages have their code copied from the English by script.
    21. ⚑ Thai. Every old Thai string is blanked and every old Thai wiki page deleted, unread. All 4,592 strings, 97 help pages and 15 public pages are written new from the English. The two syntax pages have their code copied from the English by script.
    22. ⚑ Tagalog. Every old Tagalog string is blanked and every old Tagalog wiki page deleted, unread. All 4,592 strings, 97 help pages and 15 public pages are written new from the English. The two syntax pages have their code copied from the English by script.
    23. ⚑ Turkish. Every old Turkish string is blanked and every old Turkish wiki page deleted, unread. All 4,592 strings, 97 help pages and 15 public pages are written new from the English. The syntax pages have their code copied from the English by script.
    24. ⚑ Vietnamese. Every old Vietnamese string is blanked and every old Vietnamese wiki page deleted, unread. All 4,592 strings and 63 of the 97 help pages are written new from the English. The other 34 help pages and the 15 public pages are written after them. The syntax pages have their code copied from the English by script.
    25. ⚑ Chinese. Every old Simplified Chinese string is blanked and every old Chinese wiki page deleted, unread. All 4,593 strings and 25 of the 97 help pages are written new from the English. The other 72 help pages and the 15 public pages are written after them. The syntax pages have their code copied from the English by script.
    26. ⚑ Running code never writes into src/locale. With no work-directory locale copy, LOCALE_DIR was the source tree, and every request's locale upgrade rewrote it.
      1. ⚑ Config.php now makes the work directory's copy when it is missing, owned by the run-as user.
      2. ⚑ The locale upgrade does nothing when LOCALE_DIR is still the source tree.
      3. ⚑ Config.php no longer makes the copy. A site without one keeps LOCALE_DIR as the source tree, which the guard above leaves unwritten.
    27. ⚑ The shipped locale version matches the running one. view_locale_version is 14 in all 25 locales, as RESOURCES_WIKI_VERSION is, so a site's upgrade no longer runs on every request.
    28. ⚑ Locale dropdowns. A wiki or Markdown page can draw a dropdown of the enabled locales with [{locale}], [{locale|names}], [{locale|flags}] or [{locale|flags-and-names}].
      1. ⚑ Choosing a locale reloads the page with page_locale, which an alias redirect now keeps.
      2. ⚑ Each locale has a FLAG, set in Manage Locales; database version 129 adds it with the usual flag of each shipped locale.
      3. ⚑ The Syntax help page describes the dropdowns in all 25 locales, and RESOURCES_WIKI_VERSION is 15 so sites receive it.
      4. ⚑ A shipped locale with no stored flag shows its default flag, in Manage Locales and in the dropdowns.
      5. ⚑ The Edit Locale strings table keeps to its panel: a long string id breaks, and each field fills its column.
      6. ⚑ The dropdown names the URL class through window, since in an inline handler URL finds document.URL, a string.
      7. ⚑ Each drawn heading gets a section-N anchor for its position. The dropdown sends a heading fragment as that anchor, so a translation opens at the same section.
    29. ⚑ The paused-search page is drawn by a view. Its strings were called from index.php, so an upgrade's merge dropped them and the page showed their names. PausedSearchView now draws it.
      1. ⚑ The four keys are renamed to pausedsearch_view names in all 25 locales, keeping their translations.
      2. ⚑ After a merge of a work copy, the page reads in English and in Vietnamese with no key names.
    30. The mail library calls tl() on nine keys. The merge drops them, so mail connection errors would show as key names.
    31. Forty-five keys reach tl() through a variable. The merge drops them too, such as accountaccess_component_role_purchase.
    32. ⚑ Upgrading locales can replace pages edited on a site. ConfigureTool's upgrade-locales command takes overwrite, and its menu has a matching item. Without it, edited pages are kept.
      1. ⚑ The help-page check read PUB_DATE, which does not exist, so edited help pages were always replaced. It now reads PUBDATE.
      2. ⚑ An edited English Syntax page survives a plain upgrade. The command with overwrite and the menu item both replace it.
    33. ⚑ Two strings no longer change or go missing on upgrade. The account-rename message used escaped double quotes, which the merge doubled. All 25 locales now use single quotes there.
      1. ⚑ iconlink_helper_fee_warning is added in all 25 locales. The helper fills the fee into the translated text.
    34. ⚑ The French and Spanish stemmers match Snowball, and unused strings are gone. French matched Snowball's 2007 outputs on all 20,403 words. Spanish now places RV at a short word's end and matches on all 28,390. Twenty-four strings no code uses are removed from all 25 locales.
    35. Every other locale is audited the same way. What check_locale.sh finds is written down before translating.
  2. The manuals match what Yioop does now. The wiki documentation was last given a full pass for version 9.3 in December 2022. Several source documents describe screens and settings that have changed since. Each is read against the running program and brought up to date.
    1. The five source documents are refreshed. They are yioop_docs.pdf, Ranking_Mechanisms.pdf, Yioop_Install_Guides.pdf, Yioop_Wiki_Syntax.pdf and Coding.pdf. Each is read against the screens it describes.
    2. The mail deliverability writing is finished. The standards work shipped in Phase 2, and the Mail Services wiki page already covers the Banner section and the PTR note. What remains is bringing the deliverability documents into line with that page.
  3. What has to be true before a release is true. This is the last pass over the parts a release exposes. Each item here is small on its own and easy to forget until an install fails.
    1. VersionFunctions holds only what version 9 and later need. The upgrade path from older versions is no longer supported, and the functions for it make the file hard to read.
    2. The escaping fault found in the localization audit is fixed. It is recorded in the master list beside the audit itself, and is fixed with the audit rather than after it.
  4. Other work, grouped by what it touched. Each is a deliverable of its own that came up during the arc. They are grouped by the part of Yioop they concern rather than listed one by one.
    1. ⚑ The development process lets a translated wiki page be written into PublicHelpPages.php. This is allowed late in a version, once the English pages have stopped changing.
    2. ⚑ Upgrading locales works on a site reached through PDO. A model built without a connection now takes its caller's database settings. PDO refused the empty ones that SQLite ignored.
    3. ⚑ The wiki syntax page says how witnesses answer by mail. Locales from Arabic to Kannada say the same.
    4. ⚑ The first request after a pull upgrades the locales once, in seconds. The upgrade takes the database upgrade's lock, and other requests wait. Its 5,496 page writes go in one transaction, 6.4 seconds where they took 21.1.
    5. ⚑ Themes live in app/css and each domain links to the one it uses. A domain's auxiliary.css links to a theme there. Delete sits beside Save and asks first. Version 136 moves old themes and links the ones in use. Site images are WebP.
    6. ⚑ The editor preview draws a picture inside a link. The browser's wiki parser now counts only a link's own bars, as the server's parser does.
    7. ⚑ The front counts a cookieless search before a worker runs it. Only workers counted, so searches answered 503 while waiting went uncounted. Searches stayed let through for minutes.
    8. ⚑ A hot target whose hour is over is one ask short of hot again. It was dropped, and needed its whole count again. The searches until then ran in workers and held up the crawl. The front counting searches is taken out. Its file write holds up the front on a slow disk.
    9. ⚑ ConfigureTool and GroupWikiTool move wiki content between sites, ready for the seekquarry documentation update. The parts below are grouped here because the documentation will describe these tools. Each moves pages or threads so the other site shows them as the first did.
      1. ⚑ ConfigureTool makes the databases and moves the help pages, and GroupWikiTool moves any group's pages. Createdb.php and ExportPublicHelpDb.php are gone. ConfigureTool now has createdb, export-public-help and import-public-help, on the command line and in its menu. The import puts a file's pages into a running site's wiki. It keeps the users and the other groups. GroupWikiTool can export a group's pages in the same format, and import them with type yioop. WikiPagesFile reads that format as text, so the file is never run.
      2. ⚑ Exports keep every page, and a locked import is undone with a plain message. A page with a line starting EOD was left out of export files. It now gets its own end mark, such as EOD_1. An import that finds the database in use now rolls back and says so.
      3. ⚑ The import can delete the Public and Help pages first. import-public-help wipe and a menu item delete every page of both groups, with history, links and discussion. The deletion is part of the import, so a failed import keeps the old pages.
      4. ⚑ The configure menu keeps locale and wiki page steps on screens of their own. The main menu went from 16 items to 12. Locales and Public and Help Wiki Pages each open a screen with a Return item.
      5. ⚑ An export names each page as it is named now. It took names from page revisions, which keep a page's old name. Issue pages renamed by version 124 went out as repo$1 and came back as extra pages.
      6. ⚑ An export imported on another site makes the same pages. Each page keeps its date and its thread's posts, and deleting a repository page deletes its issue pages. The export writes each page's revision time and posts beside it, and the import saves them. The Export screen and export-public-help can leave out git issue pages or posts. The menu now stops when its input ends rather than asking forever.
      7. ⚑ An import that deletes first keeps what the export left out. An export can also leave out page history, and its file says which kinds it carries. The import then deletes only pages the file lacks, and only the kinds the file brings back. Issue pages, comments and history left out of the export stay.
      8. ⚑ GroupWikiTool exports a group's pages, its discussions, or both. Pages go with their dates, history, comments and issue pages, and threads with all their posts. Its import makes them again, and its description no longer names PublicHelpPages.php.
      9. ⚑ Importing a group's discussions again adds only what is new. A thread whose first post has the same time, title and text is taken as already there. Only replies it lacks are added, so a second import of the same file adds nothing.
      10. ⚑ GroupModelTest's docblocks meet the docblock rules. Each one now opens with the name of what it describes.
      11. ⚑ A git repository page whose folder is missing still opens, with its issues. An imported page's resource path can name a folder the new site lacks. The page, its issues and its settings now open with the resource path warning, where they answered 500.
      12. ⚑ An imported Public page links to /p/ pages. The import and createdb saved pages with no link address, so a header link read href="Demos". They now use the address the wiki screen uses, WikiModel::PUBLIC_LINK_BASE.
      13. ⚑ A page any tool imports links to its own group's pages. The Public fix left other groups' imported pages saved with no link address. createdb, both imports, the dokuwiki import and the help page upgrades now save every page with WikiModel::WIKI_LINK_BASE, filled in when the page is drawn.
      14. ⚑ An export can take just the Public or just the Help group. The Export screen gains a toggle for each group, and export-public-help takes +/-public and +/-help. A file of one group declares only that group's array. An import of it, even with wipe, leaves the other group alone; before, wipe deleted every page of the group the file lacked. createdb takes that group's pages from the file Yioop ships.
    10. ⚑ Discussion badges count only what people wrote, and a group's feed has a bar to order, filter and search its threads. The post Yioop writes when a wiki page is made is not on a badge. A join item is not in a feed's count.
      1. ⚑ Badges leave out the post Yioop writes for a new wiki page. The badge counts leave out a post of type WIKI_GROUP_ITEM that starts its own thread. Comments on that thread still count.
      2. ⚑ A group's feed has a new post button, an order chooser, a filter and a search field. They replace Start New Thread. The filter lists the threads people started, or all discussions with wiki page threads. FeedModel::feedListClauses turns the choices into SQL.
      3. ⚑ A group's thread count leaves out git issue threads, as its list does. getGroupItemCount counted them, so the count and the list differed.
    11. ⚑ Badges write large counts short, as 12K or 3M. IconlinkHelper and the unread message count use intToMetric, so a long count no longer covers its button. intToMetric now writes 999,500 as 1M rather than 1000K.
    12. ⚑ createdb writes only the two databases, in about 8 seconds rather than 47.
      1. ⚑ No impressions are recorded. Each page, thread and group createdb made was logged as viewed in log/AnalyticLogs. The first real view of an item now starts its count.
      2. ⚑ No profile or DKIM key is written. The mail settings page still makes the key when it is missing.
      3. ⚑ Rows go in many to an INSERT. DatasourceManager::insertRows does this, and WikiModel::addNewPages adds the Public and Help pages with it. The databases made match the old ones, but for impressions and password salts.
    13. ⚑ Mail whose Transport Layer Security (TLS) handshake fails is not sent in plaintext. STARTTLS is the mail command that turns on TLS. A server that offered it had switched to TLS, so plaintext on that connection read no reply and the message bounced. The client now closes the connection and sends nothing. The failure is temporary, so the message is tried again later. The mail log gets the handshake's reason. On pollett.org the handshakes failed because php's file of trusted certificates was missing. SmtpClientTest writes only in the tests folder, and its case that started a mail worker is removed.
    14. ⚑ The controls above a group's threads are drawn by the icon link helper. The start, order, filter and search controls now use the helper's icons and white boxes, one height for all. The start control uses the helper's pencil, and the go button its arrow. The search field fills the rest of the bar. The helper gained sort order and go icons. The feed of all a user's groups shows the same bar under its social icons, without the pencil. Its order, filter and search work as on a group's feed. The bar above the list of groups uses the same icons and heights. It sits on Feeds and Wikis and on Manage Groups, below the fixed header. Each bar was measured at 360 and 1000 pixels wide.
    15. ⚑ The groups bar lines up with the social icon row. On Feeds and Wikis and on Manage Groups both bars now have the same top and bottom. So they stand the same distance above the first group. Measured at 360 and 1000 pixels wide.
    16. ⚑ Deleting a folder removes the symbolic links in it as links. A link to a deleted file was skipped. So used_themes_test could stay in the tests folder. A link to a folder was followed, and that folder's files were deleted. deleteFileOrDir now unlinks any link, and traverseDirectory does not walk into one.
    17. ⚑ Git issues carry labels. The bug icon opens a menu with Report issue and, for editors, Manage Labels. That page adds, renames and deletes a repository's labels. A rename or delete changes every issue with the label. An editor ticks an issue's labels on its page. The list has a Labels column and the filter menu a label entry for each label. On a narrow screen the labels show under the summary in place of the column.
    18. ⚑ PERSONAL_GROUP_PREFIX is gone from Config.php. The mail and messages screens set PERSONAL_SCREEN for the group bar rather than a made-up subtitle. The clipboard thread title is FeedModel::CLIPBOARD_TITLE_PREFIX, unchanged, so old threads are still found. The version 10 migration keeps the old prefix as OLD_PERSONAL_GROUP_PREFIX.
    19. ⚑ The git issue constants and label code say plainly what they name. Each comment opens with its constant's name and gives an example page name, such as yioop$$12 for issue 12. Waiting issues and bans are called that, not reports. MAX_HELD_GIT_ISSUES now says the oldest waiting issue is deleted, as the code does. The issue bar's search field now shrinks, so the bar fits a 360 pixel screen.
    20. ⚑ The label list page is hidden and labels are managed like resources. WikiModel::GIT_ISSUE_PAGE_MARKS lists all four marks, so the yioop$* page leaves the page list. Manage Labels adds with the add icon. Each label shows once, as a field with a check mark to rename and a cross to delete, as a page's resources do.
    21. ⚑ An issue's labels are a row of tags with an Add Label list. Each tag has a cross that takes the label off the issue. Choosing from Add Label puts one on. On Manage Labels a label's field is 14rem wide, and its check mark and cross stay on the same line.
    22. ⚑ A round is counted once. settle_gold.sh no longer counts a second time when the same message is settled again within ten minutes. A settle stopped between applying a patch and committing it no longer leaves gold unable to take the patch.
    23. ⚑ The Issues tab cleans what it is sent and writes its markup plainly. The issue and label fields go through clean(). The comment upload box is plain markup, not document.write. The load handlers use listen() from basic.js. Manage Labels has no search bar.
    24. ⚑ The Issues tab's scripts run from $data['SCRIPT']. They ran inline before basic.js loaded, so listen was not defined. SocialComponent now adds initGitScrollPager and initHeldSelection to $data['SCRIPT']. On an issue's page the word Labels is the drop-down that adds a label, and it stays after each one.
    25. ⚑ Manage Labels searches and sorts like the wiki's page list. It has a sort list and a search field. A search for a name no label has offers a link that makes it. The label rows fill min(34rem, 100%), with the check mark and cross at their end.
    26. ⚑ Search fields draw the magnifying glass inside them. Eight searches used an arrow, a Go button or a glass beside the field. These are the group, thread, resource, page, log, locale string, contact and issue searches. Each now has the glass inside its border, as the main search bar does. The unused go icon and five unused strings are gone.